from PIL import Image
import io


def png_to_webp(png_path, webp_path, quality=80):
    """
    将 PNG 图像转换为 WebP 格式。

    :param png_path: 输入 PNG 文件路径
    :param webp_path: 输出 WebP 文件路径
    :param quality: WebP 压缩质量（1-100），默认值为 80
    """
    # 打开 PNG 图像
    with Image.open(png_path) as img:
        # 转换并保存为 WebP 格式
        img.save(webp_path, 'webp', quality=quality)
        # print(f"转换完成：{png_path} -> {webp_path}，质量：{quality}")


def png_to_webp_in_memory(png_data, quality=80):
    """
    将 PNG 图像在内存中转换为 WebP 格式。

    :param png_data: 输入 PNG 图像的字节数据
    :param quality: WebP 压缩质量（1-100），默认值为 80
    :return: 转换后的 WebP 图像的字节数据
    """
    # 使用 BytesIO 打开 PNG 图像
    with Image.open(io.BytesIO(png_data)) as img:
        # 创建一个 BytesIO 对象用于保存 WebP 图像
        webp_buffer = io.BytesIO()
        # 转换并保存为 WebP 格式到内存中
        img.save(webp_buffer, 'webp', quality=quality)
        # 获取 WebP 图像的字节数据
        webp_data = webp_buffer.getvalue()
        return webp_data


def buffer_to_webp(mode, width, height, image_bytes, quality=80):
    """将图片从字节转换为WebP格式并存储到webp_buffer中。

    参数：
    width -- 图片宽度
    height -- 图片高度
    image_bytes -- 图片的字节
    webp_buffer -- 存储WebP图片的字节缓冲区
    quality -- WebP图片的质量，范围是0到100，默认是80
    """
    # 将图片从字节转换为PIL的Image对象
    image = Image.frombytes(mode, (width, height), image_bytes)
    # 创建一个 BytesIO 对象用于保存 WebP 图像
    webp_buffer = io.BytesIO()
    # 将PIL的Image对象保存为WebP格式并存储到webp_buffer中
    image.save(webp_buffer, 'webp', quality=quality)
    # 获取 WebP 图像的字节数据
    webp_data = webp_buffer.getvalue()

    return webp_data
